#include "cpu.h"
#include "key_driver.h"


struct KEY_GPIO_S
{
    GPIO_TypeDef *GPIOx;
    u16 GPIO_Pin;
    BitAction gpio_enable_status;
};

const static struct KEY_GPIO_S KEY_GPIO[KEY_MAX] = {\
    {GPIOA, GPIO_Pin_8, Bit_RESET}, \
    {GPIOC, GPIO_Pin_9, Bit_RESET}, \
    {GPIOC, GPIO_Pin_8, Bit_RESET}, \
    {GPIOC, GPIO_Pin_7, Bit_RESET}, \
    {GPIOC, GPIO_Pin_6, Bit_RESET}, \
    {GPIOD, GPIO_Pin_15, Bit_RESET}, \
    {GPIOD, GPIO_Pin_14, Bit_RESET}, \

};

void key_driver_gpio_init(E_KEY index)
{
    GPIO_InitTypeDef  GPIO_InitStructure = {0};

    if (index >= KEY_MAX)
        return ;

    GPIO_InitStructure.GPIO_Pin = KEY_GPIO[index].GPIO_Pin;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_Init(KEY_GPIO[index].GPIOx, &GPIO_InitStructure);
}

void key_driver_gpio_uninit(E_KEY index)
{
    GPIO_InitTypeDef  GPIO_InitStructure = {0};

    if (index >= KEY_MAX)
        return ;

    GPIO_InitStructure.GPIO_Pin = KEY_GPIO[index].GPIO_Pin;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_Init(KEY_GPIO[index].GPIOx, &GPIO_InitStructure);
}

E_KEY_STATE key_driver_get_pin_state(E_KEY index)
{
    if (index >= KEY_MAX)
        return KEY_STATE_DISABLE;

    u8 key_state = GPIO_ReadInputDataBit(KEY_GPIO[index].GPIOx, KEY_GPIO[index].GPIO_Pin);
    return (key_state==KEY_GPIO[index].gpio_enable_status) ? KEY_STATE_ENABLE: KEY_STATE_DISABLE;
}

